로딩 중이에요... 🐣
[코담]
웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트
22 요청 이용하기 | ✅ 저자: 이유정(박사)
Request
란?
Request
는 클라이언트(브라우저, React 앱 등)가 FastAPI 서버에 요청을 보낼 때 전달되는 모든 정보를 담고 있는 객체입니다.
쉽게 말해: "누가 언제 어떤 내용으로 요청했는지 다 담겨있는 편지 봉투"
왜 필요한가?
FastAPI는 기본적으로 GET
, POST
등의 요청을 받아서 응답을 해줘요. 하지만, 어떤 요청인지, 누구한테서 왔는지, 어떤 값을 보냈는지 세부 정보가 필요할 때가 많습니다.
예를 들어:
- 로그인한 사용자의 IP가 궁금할 때
- 요청 헤더나 쿠키로 인증 정보를 받고 싶을 때
- 요청 본문(body)에 파일이나 JSON 데이터가 있는지 확인할 때
- URL에 쿼리스트링이 붙었는지 확인할 때
Request에서 어떤 정보들을 꺼낼 수 있나?
항목 | 예시 | 설명 |
---|---|---|
request.method |
"GET" , "POST" 등 |
어떤 HTTP 방식인지 |
request.url |
http://127.0.0.1/items/3 |
전체 URL 주소 |
request.headers |
User-Agent , Authorization 등 |
요청 헤더 정보 |
request.cookies |
로그인 쿠키 등 | 쿠키 정보 |
request.query_params |
?name=abc&age=3 |
URL의 쿼리 파라미터 |
request.path_params |
items/{item_id} 중 {item_id} 값 |
|
request.body() |
JSON 등 POST로 보내는 본문 데이터 | |
request.form() |
폼 데이터를 받을 때 | |
request.client |
요청한 사람의 IP 주소 등 | |
request.app |
현재 실행 중인 FastAPI 앱 |
언제 사용하는가?
- API 디버깅할 때 (요청을 모두 기록하는 로그용)
- 사용자 인증 정보 확인
- 웹 클라이언트가 어떤 기기인지 판단할 때 (
User-Agent
) - 쿠키 기반 로그인 처리
- 성능 측정용 (미들웨어로 요청 처리 시간 측정)
요청 URL 확인
# request_info.py
from fastapi import FastAPI, Request
app = FastAPI()
@app.get("/request-info")
async def get_request_info(request: Request):
return {
"method": request.method, # 요청 방식: GET, POST 등
"url": str(request.url), # 전체 요청 URL
"client_host": request.client.host,# 클라이언트 IP 주소
"headers": dict(request.headers),# 전체 요청 헤더
"query_params": dict(request.query_params),
# 쿼리 파라미터 (?key=value)
"cookies": request.cookies, # 쿠키 정보
"path_params": request.path_params, # 경로매개변수(/{id} 등)
"app_name": str(request.app.title),# 현재 FastAPI 앱 이름
}
실행:
uvicorn request_info:app --reload
요청 결과:
{
"method": "GET",
"url": "http://localhost:8000/request-info?name=banana&price=3000",
"client_host": "127.0.0.1",
"headers": {
"host": "localhost:8000",
"user-agent": "Mozilla/5.0 ...",
"accept": "*/*",
...
},
"query_params": {
"name": "banana",
"price": "3000"
},
"cookies": {},
"path_params": {},
"app_name": "FastAPI"
}
request.method
: 어떤 방식으로 요청했는지 (GET, POST 등)request.url
: 전체 URL을 문자열로 출력request.client.host
: 요청한 사람의 IP 주소request.headers
: 요청할 때 같이 보낸 헤더들request.query_params
: URL에?key=value
로 붙은 정보request.cookies
: 쿠키를 사용하는 경우request.path_params
: URL에 포함된 변수들 (/items/{id}
같은 경우)request.app.title
: FastAPI 앱의 이름 (FastAPI()
기본값은"FastAPI"
)
Request 정보와 Header 정보는 서로 포함 관계에 있고, 목적과 범위가 다릅니다. 요청(Request)은 클라이언트(브라우저, 앱, Postman, React 등)가 서버(FastAPI, Django 등)에게 "무언가를 해달라"고 보내는 메시지입니다.
헤더는 클라이언트와 서버가 요청이나 응답을 주고받을 때 같이 보내는 '부가 정보'입니다.
- 요청(Request Header) — 클라이언트 → 서버 클라이언트(브라우저, 앱 등)가 서버로 요청을 보낼 때, 이 요청에 헤더 정보를 담습니다. 예시:
GET /items/123 HTTP/1.1
Host: localhost:8000
User-Agent: Chrome/119.0
Accept: application/json
Authorization: Bearer abc.def.ghi
해석:
- Host: 어디로 요청을 보낼 건지
- User-Agent: 누가 보냈는지 (브라우저 정보)
- Accept: 나는 어떤 형식(JSON 등)을 받고 싶어
- Authorization: 로그인 토큰 (인증 정보)
→ 이런 요청 헤더 정보는 FastAPI에서 request.headers
로 확인 가능
- 응답(Response Header) — 서버 → 클라이언트 서버가 클라이언트에게 결과를 보낼 때, 응답 데이터뿐 아니라 헤더 정보도 함께 전달합니다. 예시
HTTP/1.1 200 OK
Content-Type: application/json
X-Process-Time: 0.0041
Cache-Control: no-store
이건 FastAPI의 미들웨어나 응답 설정에서 response.headers["..."]
로 설정 가능
비유로 이해하기
-
전체 Request = 손님이 식당에 온 상황 전체
- 누가 왔는지(IP), 어떤 요리 주문했는지(URL, body), 어떤 조건으로 왔는지(헤더), 무슨 요구사항이 있는지(query) 등
-
Header = 손님이 들고 온 명함이나 요청사항 쪽지
- "나는 Chrome 브라우저를 써요", "토큰은 이거에요", "나는 JSON 응답을 원해요", "비밀번호는 쿠키에 있어요" 같은 요청 설정 정보